package br.com.sgh.dao;

import java.util.List;
import javax.faces.bean.RequestScoped;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

@RequestScoped
public class EmprestimoDAO<T> extends DAO<T> {

    public EmprestimoDAO(Class<T> classe, Session session) {
        super(classe, session);
    }

    public List<T> listarImprestimoPendentesUsuario(Integer funcionario) {
        Criterion filtro = Restrictions.isNull("dataDevolucao");
        Criteria criteria = criaCriteria().add(Restrictions.eq("funcionario.codFuncionario", funcionario));
        return criteria.add(filtro).list();
    }

    public List<T> listarRankingFuncionarios(Integer funcionario) {
        Criteria criteria = criaCriteria().add(Restrictions.eq("funcionario.codFuncionario", funcionario));
        return criteria.list();
    }

    public List<T> listarImprestimoPendentes() {
        Criterion filtro = Restrictions.isNull("dataDevolucao");
        Criteria criteria = criaCriteria().addOrder(Order.asc("previsaoEntrega"));
        return criteria.add(filtro).list();
    }

    public boolean disponibilidadeAcervo(Integer acervo) {
        Criterion filtro = Restrictions.isNull("dataDevolucao");
        Criteria criteria = criaCriteria().add(Restrictions.eq("acervo.codAcervo", acervo));
        List<T> lista = criteria.add(filtro).list();

        return lista.size() <= 0;
    }

    public List<T> verificaDisponibilidadeAcervo(Integer codAcervo) {
        Criterion filtro = Restrictions.isNull("dataDevolucao");
        Criteria criteria = criaCriteria().add(Restrictions.eq("acervo.codAcervo", codAcervo));
        List<T> lista = criteria.add(filtro).list();
        return lista;
    }

    public List<T> emprestimoPorAcervo(Integer codAcervo) {
        ///Criterion filtro = Restrictions.isNull("dataDevolucao");
        Criteria criteria = criaCriteria().add(Restrictions.eq("acervo.codAcervo", codAcervo));
        List<T> lista = criteria.list();
        // List result = criaCriteria().setProjection(Projections.projectionList().add(Projections.rowCount())
        //       .add(Projections.groupProperty("acervo.titulo"))).list();
        return lista;
    }
}
